package vista.ventanas;

import javax.swing.JPanel;

import javax.swing.BorderFactory;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

import vista.objetos.AtributoCompuestoException;
import vista.objetos.FabricaAtributoGraficable;
import vista.paneles.ElementoNoExistenteException;
import vista.paneles.PanelComposicionAtributo;
import vista.paneles.PanelParLabelText;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Window;
import java.awt.event.MouseListener;
import java.util.List;

import logica.Atributo;
import logica.AtributoDerivado;
import logica.AtributoRepetidoException;
import logica.AtributoSimple;
import logica.AtributoSimpleException;
import logica.SinNombreException;

@SuppressWarnings("serial")
public class VentanaAtributo extends SubVentanaConPanelAtributos {

	private PanelParLabelText panelNombre;
	private JTextField txtMax;
	private JTextField txtMin;
	private PanelComposicionAtributo panelComposicion;
	
	private Atributo atributo;
	
	public VentanaAtributo(Window owner, List<FabricaAtributoGraficable> tiposAtributo) 
	{
		super(owner, "Crear Atributo", ConstantesVista.ALTO_DIALOGOS);
		
		this.panelComposicion.agregarTipoAtributo(tiposAtributo);
		
		this.atributo = null;
		
	}
	
	public VentanaAtributo(Window owner, List<FabricaAtributoGraficable> tiposAtributo, Atributo atributoAEditar) throws ElementoNoExistenteException 
	{
		super(owner, "Editar Atributo", ConstantesVista.ALTO_DIALOGOS);
		
		this.panelComposicion.agregarTipoAtributo(tiposAtributo);
		
		this.atributo = atributoAEditar;
		
		setInformacionEditar();
	}

	private void setInformacionEditar() throws ElementoNoExistenteException
	{
		this.panelNombre.setInformacion(this.atributo.getNombre());
		setCardinalidadEditar();	
		setTipoAtributoEditar();
	}

	private void setTipoAtributoEditar() throws ElementoNoExistenteException
	{
		try
		{
			this.panelComposicion.seleccionarAtributoCompuesto();
			this.getPanelAtributo().agregarAtributos(this.atributo.getAtributos());
		}
		catch(AtributoSimpleException noEraCompuesto)
		{
			
			this.panelComposicion.seleccionarAtributoSimple();
			
			AtributoSimple esSimple = (AtributoSimple) this.atributo;
		
			this.panelComposicion.seleccionarTipoAtributoSimple(esSimple.getTipo());
			
			if (this.panelComposicion.getTipoAtributo().necesitaExpresion())
			{
				AtributoDerivado tieneExpresion = (AtributoDerivado)esSimple;
				
				this.panelComposicion.setExpresion(tieneExpresion.getExpresion());
			}
		}
	}

	private void setCardinalidadEditar()
	{
		this.txtMin.setText(this.atributo.getCardinalidadMinString());
		this.txtMax.setText(this.atributo.getCardinalidadMaxString());
	}
	
	/* para datos */
	public Atributo getAtributo() throws SinNombreException, AtributoRepetidoException, NumberFormatException, AtributoCompuestoException
	{
		FabricaAtributoGraficable fabrica = this.panelComposicion.getTipoAtributo();
		return fabrica.crearAtributo(this) ;
	}
	
	public String getNombreAtributo() {
		return this.panelNombre.getInformacion();
	}
			
	public String getExpresion() {
		return this.panelComposicion.getExpresion();
	}
	
	public String getCardinalidadMin() {
		return this.txtMin.getText();
	}

	public String getCardinalidadMax() {
		return this.txtMax.getText();
	}
	
	public String getTipo() {
		return this.panelComposicion.getTipoAtributo().toString();
	}
	
	/* para eventos */
	public void escucharEventoNuevoAtributo(MouseListener controlador)
	{
		this.panelComposicion.getPanelAtributo().escucharEventosBotonNuevo(controlador);
	}
	
	public void escucharEventoEliminarAtributo(MouseListener controlador)
	{
		this.panelComposicion.getPanelAtributo().escucharEventosBotonEliminar(controlador);
	}
	
	public void escucharEventoEditarAtributo(MouseListener controlador)
	{
		this.panelComposicion.getPanelAtributo().escucharEventosBotonEditar(controlador);
	}
	
	
	/* para dibujar */
	@Override
	protected void agregarComponentesPanelInformacion() 
	{
		GridBagLayout gridBagLayout = new GridBagLayout();
		gridBagLayout.columnWidths = new int[]{80, 0};
		gridBagLayout.rowHeights = new int[]{50, 10, 10, 0};
		gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
		gridBagLayout.rowWeights = new double[]{1.0, 1.0, 1.0, Double.MIN_VALUE};
		
		this.getPanelDeInformacion().setLayout(gridBagLayout);
		
		agregarPanelNombre();
		agregarPanelCardinalidad();
		agregarPanelComposicion();
	}

	private void agregarPanelComposicion() 
	{
		panelComposicion = new PanelComposicionAtributo(this.getPanelAtributo());
		
		GridBagConstraints gbc_panelComposicion = new GridBagConstraints();
		gbc_panelComposicion.insets = new Insets(0, 0, ConstantesVista.PANEL_INFORMACION_MARGEN_VERTICAL, 0);
		gbc_panelComposicion.fill = GridBagConstraints.BOTH;
		gbc_panelComposicion.gridx = 0;
		gbc_panelComposicion.gridy = 2;
		
		
		this.getPanelDeInformacion().add(panelComposicion, gbc_panelComposicion);
	}
		
	private void agregarPanelCardinalidad() 
	{
		JPanel panelCardinalidad = new JPanel();
		panelCardinalidad.setBorder(BorderFactory.createTitledBorder("Cardinalidad"));
		GridBagLayout gbl_panelCardinalidad = new GridBagLayout();
		gbl_panelCardinalidad.columnWidths = new int[]{0, 0, 0, 0, 0};
		gbl_panelCardinalidad.rowHeights = new int[]{30, 0};
		gbl_panelCardinalidad.columnWeights = new double[]{1.0, 1.0, 1.0, 1.0, Double.MIN_VALUE};
		gbl_panelCardinalidad.rowWeights = new double[]{1.0, Double.MIN_VALUE};
		panelCardinalidad.setLayout(gbl_panelCardinalidad);
		
		JLabel lblMin = new JLabel("Min");
		lblMin.setHorizontalAlignment(SwingConstants.CENTER);
		
		GridBagConstraints gbc_lblMin = new GridBagConstraints();
		gbc_lblMin.fill = GridBagConstraints.HORIZONTAL;
		gbc_lblMin.insets = new Insets(0, 0, 5, 5);
		gbc_lblMin.gridx = 0;
		gbc_lblMin.gridy = 0;
		panelCardinalidad.add(lblMin, gbc_lblMin);
		
		txtMin = new JTextField("1");

		GridBagConstraints gbc_txtMin = new GridBagConstraints();
		gbc_txtMin.fill = GridBagConstraints.BOTH;
		gbc_txtMin.insets = new Insets(0, 0, 0, 5);
		gbc_txtMin.gridx = 1;
		gbc_txtMin.gridy = 0;
		panelCardinalidad.add(txtMin, gbc_txtMin);
		
		JLabel lblMax = new JLabel("Max");

		lblMax.setHorizontalAlignment(SwingConstants.CENTER);
		GridBagConstraints gbc_lblMax = new GridBagConstraints();
		gbc_lblMax.fill = GridBagConstraints.BOTH;
		gbc_lblMax.insets = new Insets(0, 0, 5, 5);
		gbc_lblMax.gridx = 2;
		gbc_lblMax.gridy = 0;
		panelCardinalidad.add(lblMax, gbc_lblMax);
			
		txtMax = new JTextField("1");
		
		GridBagConstraints gbc_txtMax = new GridBagConstraints();
		gbc_txtMax.fill = GridBagConstraints.BOTH;
		gbc_txtMax.insets = new Insets(0, 0, 0, 5);
		gbc_txtMax.gridx = 3;
		gbc_txtMax.gridy = 0;
		panelCardinalidad.add(txtMax, gbc_txtMax);
		
		GridBagConstraints gbc_panelCardinalidad = new GridBagConstraints();
		gbc_panelCardinalidad.insets = new Insets(0, 0, ConstantesVista.PANEL_INFORMACION_MARGEN_VERTICAL, 0);
		gbc_panelCardinalidad.fill = GridBagConstraints.BOTH;
		gbc_panelCardinalidad.gridx = 0;
		gbc_panelCardinalidad.gridy = 1;

		this.getPanelDeInformacion().add(panelCardinalidad, gbc_panelCardinalidad);
	}
		
	private void agregarPanelNombre() 
	{
		panelNombre = new PanelParLabelText("Nombre");
		
		GridBagConstraints gbc_panelNombre = new GridBagConstraints();
		gbc_panelNombre.fill = GridBagConstraints.BOTH;
		gbc_panelNombre.insets = new Insets(0, 0, ConstantesVista.PANEL_INFORMACION_MARGEN_VERTICAL, 0);
		gbc_panelNombre.gridx = 0;
		gbc_panelNombre.gridy = 0;
		
		this.getPanelDeInformacion().add(panelNombre, gbc_panelNombre);		
	}	

	public PanelComposicionAtributo getPanelComposicion() 
	{
		return panelComposicion;
	}

}